/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package persistencia;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import modelo.Productos;

/**
 *
 * @author Felipe
 */
public class ProductoDAO {

    private Connection conexion;

    public Connection getConexion() {
        return conexion;
    }

    public void setConexion(Connection conexion) {
        this.conexion = conexion;
    }

    /**
     * ejecuta sentencia SQL y el resultado lo convierte en Objeto
     *
     * @param codigo
     * @return Productos
     */
    public Productos buscar(String codigo) {
        Productos registro = null;
        PreparedStatement sentencia = null;
        ResultSet resultado = null;
        try {
            // String sql = "select *  from PRODUCTOS where COD_PRODUCTO = ?"; // idx :1
            String sql = "SELECT p.COD_PRODUCTO, "
                    + "              c.NOMBRE as NOMBRE_CAT, "
                    + "              p.NOMBRE, "
                    + "              p.PRECIO_NETO, "
                    + "              p.PRECIO_VENTA,  "
                    + "              p.STOCK_ACTUAL,  "
                    + "              p.STOCK_MINIMO, "
                    + "              p.ESTADO,  "
                    + "              p.COD_CATEGORIA   "
                    + "              FROM PRODUCTOS p, CATEGORIAS c  "
                    + "              WHERE p.COD_CATEGORIA = c.COD_CATEGORIA AND p.COD_PRODUCTO = ? ";

            sentencia = conexion.prepareStatement(sql);
            sentencia.setString(1, codigo);

            resultado = sentencia.executeQuery();

            if (resultado.next()) {
                registro = new Productos();

                registro.setCodProducto(resultado.getString("COD_PRODUCTO"));
                registro.setNombre(resultado.getString("NOMBRE"));
                registro.setPrecioNeto(resultado.getInt("PRECIO_NETO"));
                registro.setPrecioVenta(resultado.getInt("PRECIO_VENTA"));
                registro.setStockMinimo(resultado.getInt("STOCK_MINIMO"));
                registro.setStockActual(resultado.getInt("STOCK_ACTUAL"));
                registro.setNombreCat(resultado.getString("NOMBRE_CAT"));
                registro.setEstado(resultado.getInt("ESTADO"));
                registro.setCodCategoria(resultado.getInt("COD_CATEGORIA"));

            }
        } catch (SQLException ex) {
            ex.printStackTrace();
            throw new RuntimeException("ProductoDAO.buscar: " + codigo, ex);
        } finally {
            try {
                resultado.close();
            } catch (Exception noGestionar) {
            }
            try {
                sentencia.close();
            } catch (Exception noGestionar) {
            }
        }
        return registro;
    }

    public Collection<Productos> buscarTodos() {
        Collection<Productos> lista = new ArrayList<Productos>();
        PreparedStatement sentencia = null;
        ResultSet resultado = null;
        try {

            String sql = "SELECT PRODUCTOS.COD_PRODUCTO, "
                    + "              CATEGORIAS.NOMBRE as NOMBRE_CAT, "
                    + "              PRODUCTOS.NOMBRE, "
                    + "              PRODUCTOS.PRECIO_NETO, "
                    + "              PRODUCTOS.PRECIO_VENTA,  "
                    + "              PRODUCTOS.STOCK_ACTUAL,  "
                    + "              PRODUCTOS.STOCK_MINIMO, "
                    + "              PRODUCTOS.ESTADO  "
                    + "              FROM PRODUCTOS, CATEGORIAS  "
                    + "              WHERE PRODUCTOS.COD_CATEGORIA = CATEGORIAS.COD_CATEGORIA ORDER BY PRODUCTOS.COD_PRODUCTO";
            sentencia = conexion.prepareStatement(sql);

            resultado = sentencia.executeQuery();
            try {
                while (resultado.next()) {
                    Productos registro = new Productos();
                    registro.setCodProducto(resultado.getString("COD_PRODUCTO"));
                    registro.setNombre(resultado.getString("NOMBRE"));
                    registro.setPrecioNeto(resultado.getInt("PRECIO_NETO"));
                    registro.setPrecioVenta(resultado.getInt("PRECIO_VENTA"));
                    registro.setStockMinimo(resultado.getInt("STOCK_MINIMO"));
                    registro.setStockActual(resultado.getInt("STOCK_ACTUAL"));
                    registro.setNombreCat(resultado.getString("NOMBRE_CAT"));
                    registro.setEstado(resultado.getInt("ESTADO"));
                    lista.add(registro);
                }
            } catch (NullPointerException ex) {
                return null;

            }

        } catch (SQLException ex) {
            //TODO Gestionar mejor esta exception
            ex.printStackTrace();
        } finally {
            try {
                resultado.close();
            } catch (Exception noGestionar) {
            }
            try {
                sentencia.close();
            } catch (Exception noGestionar) {
            }
        }
        return lista;
    }

    public void Insertar(Productos prod) {
        PreparedStatement sentencia = null;

        try {
            int estado = prod.getEstado();
            String nombre = prod.getNombre();
            int codCat = prod.getCodCategoria();
            String codProd = prod.getCodProducto();
            int precioNeto = prod.getPrecioNeto();
            int stockMin = prod.getStockMinimo();
            int stockAct = prod.getStockActual();
            int valorVenta = prod.getPrecioVenta();
            String sql = "insert into PRODUCTOS (COD_PRODUCTO, COD_CATEGORIA, NOMBRE, PRECIO_NETO, PRECIO_VENTA, STOCK_ACTUAL, STOCK_MINIMO,ESTADO) values(?,?,?,?,?,?,?,?)";
            sentencia = conexion.prepareStatement(sql);

            sentencia.setString(1, codProd);
            sentencia.setInt(2, codCat);
            sentencia.setString(3, nombre);
            sentencia.setInt(4, precioNeto);
            sentencia.setInt(5, valorVenta);
            sentencia.setInt(6, stockAct);
            sentencia.setInt(7, stockMin);
            sentencia.setInt(8, estado);

            sentencia.executeUpdate();

//          sentencia.executeUpdate(sql);
        } catch (SQLException ex) {
            
            ex.printStackTrace();
        } finally {
            try {
                sentencia.close();
            } catch (Exception noGestionar) {
            }

        }

    }

    public void eliminar(String codigo,boolean estado) {
        PreparedStatement sentencia = null;
        try {

            String sql = "UPDATE PRODUCTOS SET ESTADO = ? WHERE  COD_PRODUCTO = ?";
            sentencia = conexion.prepareStatement(sql);
            sentencia.setBoolean(1, estado);
            sentencia.setString(2, codigo);
            sentencia.executeUpdate();

        } catch (SQLException ex) {

        }
    }

    public void modificar(Productos prod) {
        PreparedStatement sentencia = null;

        try {
            String nombre = prod.getNombre();
            int codCat = prod.getCodCategoria();
            String codProd = prod.getCodProducto();
            int precioNeto = prod.getPrecioNeto();
            int stockMin = prod.getStockMinimo();
            String sql = "UPDATE PRODUCTOS set NOMBRE = ?, COD_CATEGORIA = ?, STOCK_MINIMO = ?, PRECIO_NETO =? where COD_PRODUCTO = ?";
            sentencia = conexion.prepareStatement(sql);
            sentencia.setString(1, nombre);
            sentencia.setInt(2, codCat);
            sentencia.setInt(3, stockMin);
            sentencia.setInt(4, precioNeto);
            sentencia.setString(5, codProd);

            sentencia.executeUpdate();

//          sentencia.executeUpdate(sql);
        } catch (SQLException ex) {
            //TODO Gestionar mejor esta exception
            ex.printStackTrace();
        } finally {
            try {
                sentencia.close();
            } catch (Exception noGestionar) {
            }

        }

    }

    public Productos buscarPorNombre(String nombre) {
        PreparedStatement sentencia = null;
        Productos registro = null;
        ResultSet resultado = null;
        try {
            //  String sql = "select *  from PRODUCTOS where NOMBRE = ?";
            String sql = "SELECT PRODUCTOS.COD_PRODUCTO, "
                    + "              CATEGORIAS.NOMBRE as NOMBRE_CAT, "
                    + "              PRODUCTOS.NOMBRE, "
                    + "              PRODUCTOS.PRECIO_NETO, "
                    + "              PRODUCTOS.PRECIO_VENTA,  "
                    + "              PRODUCTOS.STOCK_ACTUAL,  "
                    + "              PRODUCTOS.STOCK_MINIMO, "
                    + "              PRODUCTOS.ESTADO  "
                    + "              FROM PRODUCTOS, CATEGORIAS  "
                    + "              WHERE PRODUCTOS.COD_CATEGORIA = CATEGORIAS.COD_CATEGORIA AND PRODUCTOS.NOMBRE like ? ";
            sentencia = conexion.prepareStatement(sql);
            sentencia.setString(1, nombre);
            resultado = sentencia.executeQuery();
            if (resultado.next()) {
                registro = new Productos();

                registro.setCodProducto(resultado.getString("COD_PRODUCTO"));
                registro.setNombre(resultado.getString("NOMBRE"));
                registro.setPrecioNeto(resultado.getInt("PRECIO_NETO"));
                registro.setPrecioVenta(resultado.getInt("PRECIO_VENTA"));
                registro.setStockMinimo(resultado.getInt("STOCK_MINIMO"));
                registro.setStockActual(resultado.getInt("STOCK_ACTUAL"));
                registro.setNombreCat(resultado.getString("NOMBRE_CAT"));
                registro.setEstado(resultado.getInt("ESTADO"));

            }

        } catch (SQLException ex) {

        }
        return registro;

    }

    public Collection<Productos> StockBajo() {
        Collection<Productos> lista = new ArrayList<Productos>();
        PreparedStatement sentencia = null;
        ResultSet resultado = null;
        try {
            // String sql = "select * from PRODUCTOS order by COD_PRODUCTO";
            String sql = "SELECT P.COD_PRODUCTO, "
                    + "              C.NOMBRE as NOMBRE_CAT, "
                    + "              P.NOMBRE, "
                    + "              P.PRECIO_NETO, "
                    + "              P.PRECIO_VENTA,  "
                    + "              P.STOCK_ACTUAL,  "
                    + "              P.STOCK_MINIMO, "
                    + "              P.ESTADO,  "
                    + "              P.COD_CATEGORIA "
                    + "              FROM PRODUCTOS P, CATEGORIAS C  "
                    + "              WHERE P.COD_CATEGORIA = C.COD_CATEGORIA "
                    + "              AND P.ESTADO = ?";

            sentencia = conexion.prepareStatement(sql);
            sentencia.setInt(1, 1);
            resultado = sentencia.executeQuery();
            try {
                while (resultado.next()) {
                    int stockMinimo = (resultado.getInt("STOCK_MINIMO"));
                    int stockActual = (resultado.getInt("STOCK_ACTUAL"));
                    if (stockActual < stockMinimo) {
                        Productos registro = new Productos();
                        registro.setCodProducto(resultado.getString("COD_PRODUCTO"));
                        registro.setNombre(resultado.getString("NOMBRE"));
                        registro.setPrecioNeto(resultado.getInt("PRECIO_NETO"));
                        registro.setPrecioVenta(resultado.getInt("PRECIO_VENTA"));
                        registro.setStockMinimo(resultado.getInt("STOCK_MINIMO"));
                        registro.setStockActual(resultado.getInt("STOCK_ACTUAL"));
                        registro.setNombreCat(resultado.getString("NOMBRE_CAT"));
                        registro.setEstado(resultado.getInt("ESTADO"));

                        lista.add(registro);
                    }
                }
            } catch (NullPointerException ex) {
                return null;
            }

        } catch (SQLException ex) {
            //TODO Gestionar mejor esta exception
            ex.printStackTrace();
        } finally {
            try {
                resultado.close();
            } catch (Exception noGestionar) {
            }
            try {
                sentencia.close();
            } catch (Exception noGestionar) {
            }
        }
        return lista;
    }

    public Collection<Productos> buscarPorParteNombre(String nombre) {
        Collection<Productos> lista = new ArrayList<Productos>();
        PreparedStatement sentencia = null;
        ResultSet resultado = null;
        try {

            //String sql = "select * from PRODUCTOS where NOMBRE like ?";
            String sql = "SELECT PRODUCTOS.COD_PRODUCTO, "
                    + "              CATEGORIAS.NOMBRE as NOMBRE_CAT, "
                    + "              PRODUCTOS.NOMBRE, "
                    + "              PRODUCTOS.PRECIO_NETO, "
                    + "              PRODUCTOS.PRECIO_VENTA,  "
                    + "              PRODUCTOS.STOCK_ACTUAL,  "
                    + "              PRODUCTOS.STOCK_MINIMO, "
                    + "              PRODUCTOS.ESTADO,  "
                    + "              PRODUCTOS.COD_CATEGORIA "
                    + "              FROM PRODUCTOS, CATEGORIAS  "
                    + "              WHERE PRODUCTOS.COD_CATEGORIA = CATEGORIAS.COD_CATEGORIA  AND PRODUCTOS.NOMBRE like ?";

            sentencia = conexion.prepareStatement(sql);
            sentencia.setString(1, "%" + nombre + "%");
            resultado = sentencia.executeQuery();
            while (resultado.next()) {

                Productos registro = new Productos();
                registro.setCodProducto(resultado.getString("COD_PRODUCTO"));
                registro.setNombre(resultado.getString("NOMBRE"));
                registro.setPrecioNeto(resultado.getInt("PRECIO_NETO"));
                registro.setPrecioVenta(resultado.getInt("PRECIO_VENTA"));
                registro.setStockMinimo(resultado.getInt("STOCK_MINIMO"));
                registro.setStockActual(resultado.getInt("STOCK_ACTUAL"));
                registro.setNombreCat(resultado.getString("NOMBRE_CAT"));
                registro.setEstado(resultado.getInt("ESTADO"));

                lista.add(registro);
            }

        } catch (SQLException ex) {
            //TODO Gestionar mejor esta exception
            ex.printStackTrace();
        } finally {
            try {
                resultado.close();
            } catch (Exception noGestionar) {
            }
            try {
                sentencia.close();
            } catch (Exception noGestionar) {
            }
        }
        return lista;
    }

    public Collection<Productos> buscarPorParteCodigo(String codigo) {
        Collection<Productos> lista = new ArrayList<Productos>();
        PreparedStatement sentencia = null;
        ResultSet resultado = null;
        try {
            //   String sql = "select * from PRODUCTOS where COD_PRODUCTO like ?";
            String sql = "SELECT PRODUCTOS.COD_PRODUCTO, "
                    + "              CATEGORIAS.NOMBRE as NOMBRE_CAT, "
                    + "              PRODUCTOS.NOMBRE, "
                    + "              PRODUCTOS.PRECIO_NETO, "
                    + "              PRODUCTOS.PRECIO_VENTA,  "
                    + "              PRODUCTOS.STOCK_ACTUAL,  "
                    + "              PRODUCTOS.STOCK_MINIMO, "
                    + "              PRODUCTOS.ESTADO,  "
                    + "              PRODUCTOS.COD_CATEGORIA "
                    + "              FROM PRODUCTOS, CATEGORIAS  "
                    + "              WHERE PRODUCTOS.COD_CATEGORIA = CATEGORIAS.COD_CATEGORIA  AND PRODUCTOS.COD_PRODUCTO like ?";
            sentencia = conexion.prepareStatement(sql);
            sentencia.setString(1, "%" + codigo + "%");
            resultado = sentencia.executeQuery();
            while (resultado.next()) {

                Productos registro = new Productos();
                registro.setCodProducto(resultado.getString("COD_PRODUCTO"));
                registro.setNombre(resultado.getString("NOMBRE"));
                registro.setPrecioNeto(resultado.getInt("PRECIO_NETO"));
                registro.setPrecioVenta(resultado.getInt("PRECIO_VENTA"));
                registro.setStockMinimo(resultado.getInt("STOCK_MINIMO"));
                registro.setStockActual(resultado.getInt("STOCK_ACTUAL"));
                registro.setNombreCat(resultado.getString("NOMBRE_CAT"));
                registro.setEstado(resultado.getInt("ESTADO"));

                lista.add(registro);
            }

        } catch (SQLException ex) {
            //TODO Gestionar mejor esta exception
            ex.printStackTrace();
        } finally {
            try {
                resultado.close();
            } catch (Exception noGestionar) {
            }
            try {
                sentencia.close();
            } catch (Exception noGestionar) {
            }
        }
        return lista;
    }

    public Collection<Productos> buscarTodosCategoria() {
        Collection<Productos> lista = new ArrayList<Productos>();
        PreparedStatement sentencia = null;
        ResultSet resultado = null;
        try {
            //  String sql = "select * from PRODUCTOS  ORDER BY  COD_CATEGORIA";

            String sql = "SELECT PRODUCTOS.COD_PRODUCTO, "
                    + "              CATEGORIAS.NOMBRE as NOMBRE_CAT, "
                    + "              PRODUCTOS.NOMBRE, "
                    + "              PRODUCTOS.PRECIO_NETO, "
                    + "              PRODUCTOS.PRECIO_VENTA,  "
                    + "              PRODUCTOS.STOCK_ACTUAL,  "
                    + "              PRODUCTOS.STOCK_MINIMO, "
                    + "              PRODUCTOS.ESTADO,  "
                    + "              PRODUCTOS.COD_CATEGORIA "
                    + "              FROM PRODUCTOS, CATEGORIAS  "
                    + "              WHERE PRODUCTOS.COD_CATEGORIA = CATEGORIAS.COD_CATEGORIA  ORDER BY PRODUCTOS.COD_CATEGORIA";
            sentencia = conexion.prepareStatement(sql);
            resultado = sentencia.executeQuery();
            try {
                while (resultado.next()) {
                    Productos registro = new Productos();
                    registro.setCodProducto(resultado.getString("COD_PRODUCTO"));
                    registro.setNombre(resultado.getString("NOMBRE"));
                    registro.setPrecioNeto(resultado.getInt("PRECIO_NETO"));
                    registro.setPrecioVenta(resultado.getInt("PRECIO_VENTA"));
                    registro.setStockMinimo(resultado.getInt("STOCK_MINIMO"));
                    registro.setStockActual(resultado.getInt("STOCK_ACTUAL"));
                    registro.setNombreCat(resultado.getString("NOMBRE_CAT"));
                    registro.setEstado(resultado.getInt("ESTADO"));

                    // finalmente, agregar a la coleccion
                    lista.add(registro);
                }
            } catch (NullPointerException ex) {
                return null;

            }

        } catch (SQLException ex) {
            //TODO Gestionar mejor esta exception
            ex.printStackTrace();
        } finally {
            try {
                resultado.close();
            } catch (Exception noGestionar) {
            }
            try {
                sentencia.close();
            } catch (Exception noGestionar) {
            }
        }
        return lista;
    }

    void cambiarStock(String codProducto, int cantidad) {
        PreparedStatement sentencia = null;
        try {

            String sql = "UPDATE PRODUCTOS set STOCK_ACTUAL = ? where COD_PRODUCTO = ?";
            sentencia = conexion.prepareStatement(sql);
            sentencia.setString(2, codProducto);
            sentencia.setInt(1, cantidad);
            sentencia.executeUpdate();

        } catch (SQLException ex) {
            ex.printStackTrace();
            throw new RuntimeException("error al cambiar stock", ex);
        } finally {
            try {
                sentencia.close();
            } catch (Exception noGestionar) {
            }

        }
    }

    void migrar(int codigo, int cat) {
        PreparedStatement sentencia = null;

        try {
            String sql = "UPDATE PRODUCTOS set COD_CATEGORIA = ? where COD_CATEGORIA = ?";
            sentencia = conexion.prepareStatement(sql);
            sentencia.setInt(1, cat);
            sentencia.setInt(2, codigo);
            sentencia.executeUpdate();

        } catch (SQLException ex) {
            ex.printStackTrace();
            throw new RuntimeException("error al modificar la categoría", ex);
        } finally {
            try {
                sentencia.close();
            } catch (Exception noGestionar) {
            }
        }
    }

}
